package com.smartwebx.ha.dal.util;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.time.DateUtils;

import com.smartwebx.ha.dal.usebean.SplitDateAndTimePointBean;
import com.smartwebx.ha.dal.usebean.SplitDatePointBean;

/**
 * 用于分割一个时间段内时间点，用于雨情
 * 
 * @author XX
 * 
 */
public class SplitDatePoint {

	public static void main(String[] args) throws ParseException {
		Date now = DateUtils.truncate(new Date(), Calendar.DATE);
		Date before = DateUtils.addDays(now, -10);
		Date firstDate = before;
		Date secondDate = DateUtils.addHours(before, 20);

		SplitDatePointBean pointBean = SplitDatePoint.splitDatePoint(now,
				now);
		System.out.println(pointBean);
	}

	/**
	 * 获得大于开始时间所有站码的雨晴数据<br/>
	 * 
	 * 1、如果不提供开始与结束日期，则默认以当前日期为准 <br/>
	 * 2、如果开始日期大于结束日期，则相互调换 <br/>
	 * 3、如果开始结束日期相同，则开始为设置的时间，结束为设置时间的下一天 <br/>
	 * 4、如果设置日期为系统当前日期，则判断系统时间是否大于8点 如果大于8点，则开始时间为8时、结束时间为当前小时
	 * 如果小于等于8点，则开始时间为昨日8时、结束时间为当前日期的当前小时 <br/>
	 * 5、如果结束日期为当前系统当前日期，则结束时间为当前日期的当前小时
	 * 
	 * @param startDate
	 *            开始日期
	 * @param endDate
	 *            结束日期
	 * @return 返回数组，数据依次为 数据类型（operatType）、开始时间（startTime）、结束时间（endTime）、
	 *         开始小时（startHour）、结束小时（endHour）
	 * 
	 * @throws ParseException
	 */
	public static SplitDatePointBean splitDatePoint(Date startDate, Date endDate) {
		/*
		 * 操作类型 1、时间相等且为当前时间且系统时间大于8时，需计算当日8时到系统小时的累计值，开始结束日期设置为null
		 * 2、时间相等且为当前时间且系统时间小于等于8时，需计算前日8时到当前小时的累计值，开始结束日期设置为null
		 * 3、时间相等且不等于当前时间，需计算设置日期到后日日期的值
		 * 4、时间不相等且结束日期与系统日期相等且系统时间大于8时，需计算开始日期到结束日期前一日日期的日雨量与当前日期8时到当前小时的时段累计雨量
		 * 5
		 * 、时间不相等且结束日期与系统日期相等且系统时间小于等于8时，需计算开始日期到结束日期前两日日期的日雨量与当前日期的前日8时到当前小时的时段累计雨量
		 * 6、时间不相等且结束日期与系统日期不相等，需计算日期段得旬日雨量
		 * 7、补充类型5，如果处理后的开始时间大于结束时间，则开始结束统一设为null，只计算小时累计值。例如：2011-8-4 ——
		 * 2011-8-5 系统小时小于8点，则按照情况5进行处理，结果为：2011-8-4，2011-8-3，2011-8-4
		 * 08:0，2011-8-5 当前小时:00 ，如此则开始日期大于结束日期，有悖逻辑！
		 */
		String operatType = null;

		// 开始时间，结束时间
		Date startTime = null, endTime = null;
		// 开始小时，结束小时 用于操作类型中的 4、5
		Date startHour = null, endHour = null;

		Date nowTime = new Date();

		// 当前日期，不包含小时
		Date nowDate = DateUtils.truncate(nowTime, Calendar.DATE);
		// 系统当前日期的昨日日期
		Date nowYest = DateUtils.addDays(nowDate, -1);

		// 当前小时
		int nowHour = ((Long) DateUtils.getFragmentInHours(nowTime,
				Calendar.DATE)).intValue();

		// 是否默认当前日期
		if (startDate == null && endDate == null) {
			startDate = nowDate;
			endDate = nowDate;
		} else if (startDate == null) {
			startDate = nowDate;
		} else if (endDate == null) {
			endDate = nowDate;
		}
		// 去除时分秒
		startDate = DateUtils.truncate(startDate, Calendar.DATE);
		endDate = DateUtils.truncate(endDate, Calendar.DATE);

		// 判断开始日期是否大于结束日期，则相互调换
		if (startDate.after(endDate)) {
			startTime = endDate;
			endTime = startDate;
		} else {
			startTime = startDate;
			endTime = endDate;
		}

		// 开始结束日期是否相等
		if (startTime.compareTo(endTime) == 0) {
			// 是否为系统当前日期
			if (nowDate.compareTo(startTime) == 0) {
				// 当前小时是否大于8时
				if (nowHour > 8) {
					operatType = "1";

					startTime = DateUtils.addHours(startTime, 9);
					endTime = DateUtils.addHours(endTime, nowHour + 1);
				} else {
					operatType = "2";

					startTime = DateUtils.addHours(nowYest, 9);
					endTime = DateUtils.addHours(endTime, nowHour + 1);
				}
			} else { // 不为系统当前时间
				operatType = "3";

				// 结束时间为时间的下一天
				endTime = DateUtils.addDays(endTime, 1);
			}
		} else {
			// 结束日期是否为当前日期
			if (nowDate.compareTo(endTime) == 0) {
				Integer deffDay = 0;

				if (nowHour > 8) {
					operatType = "4";
					deffDay = 1;
				} else {
					operatType = "5";
					deffDay = 2;
				}
				endTime = DateUtils.addDays(nowDate, -deffDay);

				if (operatType.equals("4")) {
					startHour = DateUtils.addHours(nowDate, 9);
				} else if (operatType.equals("5")) {
					startHour = DateUtils.addHours(nowYest, 9);
				}

				endHour = DateUtils.addHours(nowDate, nowHour + 1);
			} else {
				operatType = "6";
			}
		}
		// 对类型 5 进行特殊处理，因为进过处理后开始日期可能大于结束日期，这样开始结束日期统一设置为null，只计算小时累计值
		if (operatType.equals("5")) {
			if (startTime.after(endTime)) {
				startTime = null;
				endTime = null;
				operatType = "7";
			}
		} else if (operatType.equals("1") || operatType.equals("2")) {
			// 类型1和2 时，只计算小时雨量累计值，没有旬日雨量的计算
			startHour = startTime;
			endHour = endTime;
			startTime = null;
			endTime = null;
		}

		return new SplitDatePointBean(operatType, startTime, endTime,
				startHour, endHour);
	}

}
